﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ENProyectoSIETE;
using CADProyectoSIETE.Properties;
using System.Configuration;
using System.Data;
using System.Data.Sql;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using CADProyectoSIETE.BDProyecto7DataSetTableAdapters;
using System.Collections;

namespace CADProyectoSIETE
{
    public class ObjetoCAD
    {                                           
        SqlConnection conexion = new SqlConnection(Settings.Default.BDProyecto7ConnectionString);
        
        // obtiene todos los objetos que tenemos en la bd
        public DataSet obtenerObjetos() {
            try
            {
                DataSet bd = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from Objeto", conexion);
                da.Fill(bd,"objeto");
                return bd;
            }

            catch (Exception ex) {
                DataSet bd = new DataSet();
                throw ex;
            }
        }

        // obtiene el objeto que se le pasa por parametro
        public ENObjeto obtenerObjeto(int index)
        {
            try
            {
                DataSet bd = new DataSet();

                SqlDataAdapter da = new SqlDataAdapter("select * from Objeto where idObjeto=" + index.ToString(), conexion);
                da.Fill(bd, "objeto");
                //DataTable tabla = new DataTable();
                //tabla = bd.Tables["objeto"];
                ENObjeto objeto = new ENObjeto();
                foreach(DataRow fila in bd.Tables["objeto"].Rows){
                    objeto.NombreObjeto = fila[1].ToString();
                    objeto.TipoObjeto = int.Parse(fila[2].ToString());
                    if (int.Parse(fila[3].ToString())!=0){
                        objeto.AtaqueObjeto = int.Parse(fila[3].ToString());
                        objeto.DefensaObjeto = 0;
                        objeto.CuracionObjeto = 0;
                    }
                    else if (int.Parse(fila[4].ToString())!=0){
                        objeto.AtaqueObjeto = 0;
                        objeto.DefensaObjeto = int.Parse(fila[4].ToString());
                        objeto.CuracionObjeto = 0;
                    }
                    else if (int.Parse(fila[5].ToString())!=0){
                        objeto.AtaqueObjeto = 0;
                        objeto.DefensaObjeto = 0;
                        objeto.CuracionObjeto = int.Parse(fila[5].ToString());
                    }
                    objeto.PrecioObjeto = int.Parse(fila[6].ToString());
                    objeto.DescripcionObjeto = fila[7].ToString();
                    objeto.ImagenObjeto = fila[8].ToString();
                }
                return objeto;
            }

            catch (Exception ex)
            {
                throw ex;
            }
        }
        
        public DataTable obtenerObjetoNombre(string nombre, string nom_des)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = null;
                if (nom_des == "nombre")
                {
                    da = new SqlDataAdapter("select * from objeto where nombreObjeto LIKE '%" + nombre + "%'", conex);
                }
                else if (nom_des == "descripcion")
                {
                    da = new SqlDataAdapter("select * from objeto where descripcionObjeto LIKE '%" + nombre + "%'", conex);
                }
                da.Fill(bdvirtual, "objeto");
                DataTable tabla = new DataTable();
                tabla = bdvirtual.Tables["objeto"];
                return tabla;
            }
            catch
            {
                DataTable tablavacia = new DataTable();
                return tablavacia;
            }
            finally
            {
                conex.Close();
            }
        }
        //inserta un objeto pasado por parametro en la BD
        public void insertarObjeto(ENObjeto nuevoObjeto)
        {
            try
            {
                ObjetoTableAdapter objTableAdapter = new ObjetoTableAdapter();
                objTableAdapter.Insert(nuevoObjeto.NombreObjeto, nuevoObjeto.TipoObjeto, nuevoObjeto.AtaqueObjeto, nuevoObjeto.DefensaObjeto, nuevoObjeto.CuracionObjeto, nuevoObjeto.PrecioObjeto, nuevoObjeto.DescripcionObjeto, nuevoObjeto.ImagenObjeto);

                /*DataSet bd = new DataSet();

                SqlDataAdapter da = new SqlDataAdapter("select * from Objeto", conexion);
                da.Fill(bd, "objeto");

                DataTable tabla = new DataTable();
                tabla = bd.Tables["objeto"];
                DataRow nuevaFila = tabla.NewRow();
                nuevaFila[0] = nuevoObjeto.NombreObjeto;
                nuevaFila[1] = nuevoObjeto.TipoObjeto;
                nuevaFila[2] = nuevoObjeto.AtaqueObjeto;
                nuevaFila[3] = nuevoObjeto.DefensaObjeto;
                nuevaFila[4] = nuevoObjeto.CuracionObjeto;
                nuevaFila[5] = nuevoObjeto.PrecioObjeto;
                nuevaFila[6] = nuevoObjeto.DescripcionObjeto;
                nuevaFila[7] = nuevoObjeto.ImagenObjeto;

                tabla.Rows.Add(nuevaFila);
                
                
                SqlCommandBuilder cbuilder = new SqlCommandBuilder(da);
                da.Update(bd, "objeto");

                return bd;*/
            }

            catch (Exception ex)
            {
                throw (ex);
            }
        }

        public void editarObjeto(int id, ENObjeto nuevoObjeto) {
            try
            {
                ObjetoTableAdapter objTableAdapter = new ObjetoTableAdapter();
                objTableAdapter.Update(id, nuevoObjeto.NombreObjeto, nuevoObjeto.TipoObjeto, nuevoObjeto.AtaqueObjeto, nuevoObjeto.DefensaObjeto, nuevoObjeto.CuracionObjeto, nuevoObjeto.PrecioObjeto, nuevoObjeto.DescripcionObjeto, nuevoObjeto.ImagenObjeto);
            }
            catch (Exception ex) 
            {
                throw (ex);
            }
        }

        public void borrarObjeto(int id) {
            try
            {
                ObjetoTableAdapter objTableAdapter = new ObjetoTableAdapter();
                objTableAdapter.Delete(id);
            }
            catch (Exception ex) {
                throw ex;
            }
        }

        public DataTable buscarObjetos(string filtro) {
            try
            {
                ObjetoTableAdapter objTA = new ObjetoTableAdapter();
                return objTA.buscarObjetosNombre(filtro);

            }
            catch (Exception ex) 
            {
                throw ex;
            }
        
        }

        // inserta un nuevo tipo de objeto pasado por parametro en la BD
        public string insertarTipo(string nuevoTipo) {
            try
            {
                TipoObjetoTableAdapter tipoObjetoTA = new TipoObjetoTableAdapter();
                tipoObjetoTA.Insert(nuevoTipo); 
                return "ok";
            }
            catch (Exception ex) {
                throw ex;
            }
        }

        // borrar un tipo de objeto pasado por prametro de la BD
        public void borrarTipo(int tipo)
        {
            try
            {
                TipoObjetoTableAdapter tipoObjetoTA = new TipoObjetoTableAdapter();
                tipoObjetoTA.Delete(tipo);
                //return "ok";
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable obtenerTipoObjetos() 
        {
            try
            {
                TipoObjetoTableAdapter tipoTA = new TipoObjetoTableAdapter();
                return tipoTA.obtenerTipos();
            }
            catch (Exception ex) 
            {
                throw ex;
            }
        }

        public DataTable buscarObjetosTaberna(string cadena)
        {
            try
            {
               ObjetoTableAdapter tabernaTa = new ObjetoTableAdapter();
                return tabernaTa.obtenerObjetoNoTabernaNombre(cadena);
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        //Obtiene todos los objetos asociados a una localizacion que se pasa por argumento
        public ArrayList obtenerObjetoLocalizacion(int idLocalizacion)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);
    
            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select idObjeto, porcentaje from objetolocalizacion  where idLocalizacion=" + idLocalizacion.ToString(), conex);

                da.Fill(bdvirtual, "objetolocalizacion");

                ArrayList objetos = new ArrayList();    

                foreach (DataRow registro in bdvirtual.Tables["objetolocalizacion"].Rows)
                {
                    ENObjetoLocalizacion objeto = new ENObjetoLocalizacion();

                    objeto.IDObjeto = int.Parse(registro[0].ToString());
                    objeto.Porcentaje = int.Parse(registro[1].ToString());
                    objeto.Nombre = "";

                    objetos.Add(objeto);
                }
                
                foreach (ENObjetoLocalizacion item in objetos)
                {
                    SqlDataAdapter danombre = new SqlDataAdapter("select nombreObjeto from objeto where idObjeto="+item.IDObjeto, conex);
                    DataSet bdvirtualnombre = new DataSet();
                    danombre.Fill(bdvirtualnombre, "objeto");

                    item.Nombre = bdvirtualnombre.Tables["objeto"].Rows[0][0].ToString();
                }

                return objetos;
            }
            catch
            {
                ArrayList objetoserror = new ArrayList();
                return objetoserror;
            }
            finally
            {
                conex.Close();
            }
        
        }
    }
}
